########## 用法：#########
# from frame_display import show_frame_scaled
# flag = show_frame_scaled(frame, window_name="frame", mode="video", scale_factor=0.85)
# if not flag:  # 空格键退出
#     break
##########################
import cv2
import screeninfo  # pip install screeninfo

def show_frame_scaled(frame, window_name="Display", mode="image", scale_factor=0.85, show=False):
    """
    按显示器分辨率和缩放比例缩放视频帧，窗口大小与画面一致，可调节显示比例。
    按空格键退出。

    参数:
        frame (ndarray): 原始视频帧
        window_name (str): 显示窗口名称
        mode (str): "video" 或 "image"
        scale_factor (float): 缩放比例系数，1.0 表示按屏幕最大显示，0.5 表示缩小 50%，scale_factor=0 原图

    返回:
        True 继续播放
        False 退出播放
    """
    if show:
        if scale_factor > 0:
            # 获取主屏幕分辨率
            monitor = screeninfo.get_monitors()[0]
            target_w, target_h = monitor.width, monitor.height

            h, w = frame.shape[:2]

            # 计算等比例缩放比例（先适配屏幕，再乘以自定义scale_factor）
            scale = min(target_w / w, target_h / h) * scale_factor
            new_w, new_h = int(w * scale), int(h * scale)

            # 缩放视频帧
            frame_resized = cv2.resize(frame, (new_w, new_h), interpolation=cv2.INTER_AREA)

            # 创建窗口并调整大小
            cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
            cv2.resizeWindow(window_name, new_w, new_h)

            # 显示
            cv2.imshow(window_name, frame_resized)

        else:
            cv2.imshow(window_name, frame)

    # 视频模式
    if mode == "video":
        key = cv2.waitKey(1) & 0xFF # cv2.waitKey 返回按键的 ASCII 码
    # 图片模式
    elif mode == "image":
        key = cv2.waitKey(0) & 0xFF
    else:
        # key = cv2.waitKey(mode) & 0xFF
        raise ValueError("mode 参数必须是 'video' 或 'image'")

    # 检查按键
    if key == ord(' '):
        return True
    return False


def test():
    monitor = screeninfo.get_monitors()[0]
    print(f" monitor: {monitor}\n monitor_width: {monitor.width}\n monitor_height: {monitor.height}")
    image = cv2.imread("data/p1.jpg")
    print(" image_shape:", image.shape[:2]) # image.shape: (3000, 4000, 3)
    show_frame_scaled(image, show=True)


if __name__ == "__main__":
    test()
